package dto

import (
	"database/sql/driver"
	"fmt"
	"time"
)

// 此结构体是为了解决gorm解析时间字段后会将格式转换为带着时区和毫秒的形式，不符合我们常见的格式

type MyTime time.Time

// 数据解析需要重写该方法
func (t *MyTime) MarshalJSON() ([]byte, error) {
	tTime := time.Time(*t)
	return []byte(fmt.Sprintf("\"%v\"", tTime.Format("2006-01-02 15:04:05"))), nil
}

// 实现此方法可以做到，在insert时，自动给updateTime赋值（实际上是在获取时间时，如果时间未赋值，就会默认赋值为当前时间）
func (t MyTime) Value() (driver.Value, error) {
	var zeroTime time.Time
	tlt := time.Time(t)
	//判断给定时间是否和默认零时间的时间戳相同
	if tlt.UnixNano() == zeroTime.UnixNano() {
		return nil, nil
	}
	return tlt, nil
}

// 该方法可以在数据还未正式从数据库查出来之前，对数据进行处理。可自定义
func (t *MyTime) Scan(v interface{}) error {
	if value, ok := v.(time.Time); ok {
		*t = MyTime(value)
		return nil
	}
	return fmt.Errorf("can not convert %v to timestamp", v)
}
